/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.serviportales.serviquality.managers;

import java.util.List;

import javax.swing.tree.DefaultMutableTreeNode;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.serviportales.serviportales.model.GenericNodeUserObject;
import com.serviportales.serviportales.model.GenericTreeModel;
import com.serviportales.serviquality.dao.ProyectoNodoDAO;
import com.serviportales.serviquality.exception.ServiqualityException;
import com.serviportales.serviquality.model.Proyecto;
import com.serviportales.serviquality.model.ProyectoNodo;

@Service
@Transactional(rollbackFor = { ServiqualityException.class })
public class MgrProyectoNodo {


	@Autowired
	private ProyectoNodoDAO proyectoNodoDAO;
	@Autowired
	private MessageSource messageSource;

	public void grabarProyectoNodo(ProyectoNodo proyectoNodo) throws ServiqualityException {
		try {
			ProyectoNodo proyectoNodoFilter = proyectoNodoDAO.selectByID(proyectoNodo.getProyectoNodoPK());
			if (proyectoNodoFilter != null) {
				proyectoNodoFilter.setConclusion(proyectoNodo.getConclusion());
				proyectoNodoFilter.setPeso(proyectoNodo.getPeso());
				proyectoNodoFilter.setValorEsperado(proyectoNodo.getValorEsperado());
				proyectoNodoDAO.update(proyectoNodoFilter);
			} else {
				proyectoNodoDAO.insert(proyectoNodo);
			}
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.GRABAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}

	public List<ProyectoNodo> buscarChildren(ProyectoNodo proyectoNodo) throws ServiqualityException {
		try {

			return proyectoNodoDAO.selectChildren(proyectoNodo);
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.BUSCAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}

	@SuppressWarnings("unchecked")
	private void serPoPendienteAsignar(DefaultMutableTreeNode treeNode) {
		GenericNodeUserObject<ProyectoNodo> userObject = (GenericNodeUserObject<ProyectoNodo>) treeNode.getUserObject();
		if (userObject.isLeaf()) {
			userObject.getValue().setPoPendienteAsignar(0L);
		} else {
			long poPendienteAsignar = 100;
			for (int i = 0; i < treeNode.getChildCount(); i++) {
				DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) treeNode.getChildAt(i);
				serPoPendienteAsignar(childNode);
				GenericNodeUserObject<ProyectoNodo> childUserObject = ((GenericNodeUserObject<ProyectoNodo>) childNode.getUserObject());
				long peso = (childUserObject.getValue().getPeso() != null) ? childUserObject.getValue().getPeso() : 0;
				poPendienteAsignar -= peso;
			}
			userObject.getValue().setPoPendienteAsignar(poPendienteAsignar);
		}
	}

	public GenericTreeModel<ProyectoNodo> createTree(Proyecto proyecto) throws ServiqualityException {
		try {
			GenericTreeModel<ProyectoNodo> tree = new GenericTreeModel<ProyectoNodo>();
			ProyectoNodo proyectoNodoRoot = new ProyectoNodo();
			proyectoNodoRoot.getProyectoNodoPK().setProyecto(proyecto);
			tree.setRootNode(proyectoNodoRoot.getProyectoNodoPK().getProyecto().getNombre(), proyectoNodoRoot);

			List<ProyectoNodo> nodos = proyectoNodoDAO.selectCreateTree(proyecto);
			for (ProyectoNodo proyectoNodo : nodos) {
				tree.addNode(proyectoNodo.getParent(), proyectoNodo.getProyectoNodoPK().getNodo().getNombre(), proyectoNodo);
			}

			tree.finishConfig();

			serPoPendienteAsignar((DefaultMutableTreeNode) tree.getRoot());
			return tree;
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.BUSCAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}
}
